package edu.client;

import java.util.LinkedList;
import java.util.List;

import com.google.gwt.core.client.GWT;
import com.google.gwt.dom.client.Style.Unit;
import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.event.dom.client.ClickHandler;
import com.google.gwt.i18n.client.DateTimeFormat;
import com.google.gwt.user.client.Window;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.google.gwt.user.client.ui.Button;
import com.google.gwt.user.client.ui.FlexTable;
import com.google.gwt.user.client.ui.HasHorizontalAlignment;
import com.google.gwt.user.client.ui.Label;
import com.google.gwt.user.client.ui.LayoutPanel;
import com.google.gwt.user.client.ui.PopupPanel;
import com.google.gwt.user.client.ui.ScrollPanel;
import com.google.gwt.user.client.ui.TextArea;
import com.google.gwt.user.client.ui.TextBox;
import com.google.gwt.user.client.ui.ValueBoxBase.TextAlignment;

import edu.client.ComprasService.ComprasService;
import edu.client.ComprasService.ComprasServiceAsync;
import edu.shared.DTO.OrdenCompraProductoDTO;
import edu.shared.DTO.RenglonOrdenCompraProductoDTO;
	
public class P_DetalleOrdenCompraProducto extends PopupPanel {

	TextBox proovedorTB;
	private TextBox modoEnvioTB;
	private TextBox formaPagoTB;
	private TextBox ivaTB;
	TextBox ultimaFechaEdicionTB;
	private TextArea taObservaciones;
	
	private static final int COL_ELEMENTO = 0;
	private static final int COL_MATERIAL = 1;
	private static final int COL_MEDIDA_FIJA = 2;
	private static final int COL_MEDIDA_VARIABLE_1 = 3;
	private static final int COL_MEDIDA_VARIABLE_2 = 4;
	private static final int COL_CANTIDAD_REQUERIDA = 5;
	private static final int COL_CANTIDAD_A_COMPRAR = 6;
	private static final int COL_PRECIO = 7;
	private static final int COL_SUBTOTAL = 8;

	private FlexTable ftRenglones;
	private TextBox totalTB;
	
	//variables de lógica
	private int idOrdenCompraProducto;
	private OrdenCompraProductoDTO orden;
	private List<Double> precios;
	private ComprasServiceAsync comprasService;	
		
	public P_DetalleOrdenCompraProducto(int idOrdenCompraProducto, boolean permiteImpresion) {
				
		super(false);
		
		comprasService = GWT.create(ComprasService.class);	
	
		this.idOrdenCompraProducto = idOrdenCompraProducto;
		
		setSize("895px", "643px");
		setStyleName("fondoPopup");
		
		LayoutPanel layoutPanel = new LayoutPanel();
		setWidget(layoutPanel);
		layoutPanel.setSize("873px", "650px");
		
		Label lblOrdenCompraProducto = new Label("DETALLE DE LA ORDEN DE COMPRA DE PRODUCTOS");
		lblOrdenCompraProducto.setStyleName("labelTitulo");
		layoutPanel.add(lblOrdenCompraProducto);
		layoutPanel.setWidgetLeftWidth(lblOrdenCompraProducto, 2.5, Unit.PCT, 95.0, Unit.PCT);
		layoutPanel.setWidgetTopHeight(lblOrdenCompraProducto, 15.0, Unit.PX, 50.0, Unit.PX);
		
		Label lblProveedor = new Label("PROOVEDOR:");
		lblProveedor.setHorizontalAlignment(HasHorizontalAlignment.ALIGN_RIGHT);
		layoutPanel.add(lblProveedor);
		layoutPanel.setWidgetLeftWidth(lblProveedor, 0.0, Unit.PCT, 19.8, Unit.PCT);
		layoutPanel.setWidgetTopHeight(lblProveedor, 80.0, Unit.PX, 19.0, Unit.PX);
		
		proovedorTB = new TextBox();
		layoutPanel.add(proovedorTB);
		layoutPanel.setWidgetLeftWidth(proovedorTB, 20.0, Unit.PCT, 25.0, Unit.PCT);
		layoutPanel.setWidgetTopHeight(proovedorTB, 75.0, Unit.PX, 32.0, Unit.PX);
		proovedorTB.setEnabled(false);
		
		Label lblUltimaFechaEdicion = new Label("ÚLTIMA FECHA DE EDICIÓN:");
		lblUltimaFechaEdicion.setHorizontalAlignment(HasHorizontalAlignment.ALIGN_RIGHT);
		layoutPanel.add(lblUltimaFechaEdicion);
		layoutPanel.setWidgetLeftWidth(lblUltimaFechaEdicion, 50.0, Unit.PCT, 19.8, Unit.PCT);
		layoutPanel.setWidgetTopHeight(lblUltimaFechaEdicion, 80.0, Unit.PX, 19.0, Unit.PX);

		ultimaFechaEdicionTB = new TextBox();
		layoutPanel.add(ultimaFechaEdicionTB);
		layoutPanel.setWidgetLeftWidth(ultimaFechaEdicionTB, 70.0, Unit.PCT, 25.0, Unit.PCT);
		layoutPanel.setWidgetTopHeight(ultimaFechaEdicionTB, 75.0, Unit.PX, 32.0, Unit.PX);
		ultimaFechaEdicionTB.setEnabled(false);
		
		Label lblModoEnvio = new Label("MODO DE ENVÍO:");
		lblModoEnvio.setHorizontalAlignment(HasHorizontalAlignment.ALIGN_RIGHT);
		layoutPanel.add(lblModoEnvio);
		layoutPanel.setWidgetLeftWidth(lblModoEnvio, 0.0, Unit.PCT, 19.8, Unit.PCT);
		layoutPanel.setWidgetTopHeight(lblModoEnvio, 120.0, Unit.PX, 19.0, Unit.PX);

		modoEnvioTB = new TextBox();
		layoutPanel.add(modoEnvioTB);
		layoutPanel.setWidgetLeftWidth(modoEnvioTB, 20.0, Unit.PCT, 25.0, Unit.PCT);
		layoutPanel.setWidgetTopHeight(modoEnvioTB, 115.0, Unit.PX, 32.0, Unit.PX);
		modoEnvioTB.setEnabled(false);
		
		Label lblFormaPago = new Label("FORMA DE PAGO:");
		lblFormaPago.setHorizontalAlignment(HasHorizontalAlignment.ALIGN_RIGHT);
		layoutPanel.add(lblFormaPago);
		layoutPanel.setWidgetLeftWidth(lblFormaPago, 50.0, Unit.PCT, 19.8, Unit.PCT);
		layoutPanel.setWidgetTopHeight(lblFormaPago, 120.0, Unit.PX, 19.0, Unit.PX);

		formaPagoTB = new TextBox();
		layoutPanel.add(formaPagoTB);
		layoutPanel.setWidgetLeftWidth(formaPagoTB, 70.0, Unit.PCT, 25.0, Unit.PCT);
		layoutPanel.setWidgetTopHeight(formaPagoTB, 115.0, Unit.PX, 32.0, Unit.PX);
		formaPagoTB.setEnabled(false);
		
		Label lblIVA = new Label("IVA:");
		lblIVA.setHorizontalAlignment(HasHorizontalAlignment.ALIGN_RIGHT);
		layoutPanel.add(lblIVA);
		layoutPanel.setWidgetLeftWidth(lblIVA, 0.0, Unit.PCT, 19.8, Unit.PCT);
		layoutPanel.setWidgetTopHeight(lblIVA, 160.0, Unit.PX, 19.0, Unit.PX);

		ivaTB = new TextBox();
		layoutPanel.add(ivaTB);
		layoutPanel.setWidgetLeftWidth(ivaTB, 20.0, Unit.PCT, 25.0, Unit.PCT);
		layoutPanel.setWidgetTopHeight(ivaTB, 155.0, Unit.PX, 32.0, Unit.PX);
		ivaTB.setEnabled(false);

		Label lblObservaciones = new Label("OBSERVACIONES:");
		lblObservaciones.setHorizontalAlignment(HasHorizontalAlignment.ALIGN_RIGHT);
		layoutPanel.add(lblObservaciones);
		layoutPanel.setWidgetLeftWidth(lblObservaciones, 0.0, Unit.PCT, 19.8, Unit.PCT);
		layoutPanel.setWidgetTopHeight(lblObservaciones, 200.0, Unit.PX, 19.0, Unit.PX);
		
		taObservaciones = new TextArea();
		taObservaciones.setEnabled(false);
		layoutPanel.add(taObservaciones);
		layoutPanel.setWidgetLeftWidth(taObservaciones, 20.0, Unit.PCT, 75.0, Unit.PCT);
		layoutPanel.setWidgetTopHeight(taObservaciones, 195.0, Unit.PX, 47.0, Unit.PX);
		
		Label lblProductos = new Label("PRODUCTOS");
		lblProductos.setStyleName("labelTitulo");
		layoutPanel.add(lblProductos);
		layoutPanel.setWidgetLeftWidth(lblProductos, 2.5, Unit.PCT, 95.0, Unit.PCT);
		layoutPanel.setWidgetTopHeight(lblProductos, 230.0, Unit.PX, 50.0, Unit.PX);
		
		ScrollPanel scrollPanel = new ScrollPanel();
		layoutPanel.add(scrollPanel);
		layoutPanel.setWidgetLeftWidth(scrollPanel, 5.0, Unit.PCT, 90.0, Unit.PCT);
		layoutPanel.setWidgetTopHeight(scrollPanel, 290.0, Unit.PX, 250.0, Unit.PX);
		scrollPanel.setStyleName("tabla");
		
		ftRenglones = new FlexTable();
		scrollPanel.setWidget(ftRenglones);
		ftRenglones.setSize("100%", "100%");
		
		//cargamos el encabezado de la tabla
		// columna elemento
		ftRenglones.setText(0, COL_ELEMENTO, "ELEMENTO");
		ftRenglones.getCellFormatter().setWidth(0, COL_ELEMENTO, "15%");
		
		// columna material
		ftRenglones.setText(0, COL_MATERIAL, "MATERIAL");
		ftRenglones.getCellFormatter().setWidth(0, COL_MATERIAL, "15%");
		
		// columna medida fija
		ftRenglones.setText(0, COL_MEDIDA_FIJA, "MEDIDA FIJA");
		ftRenglones.getCellFormatter().setWidth(0, COL_MEDIDA_FIJA, "10%");
		
		// columna medida variable 1
		ftRenglones.setText(0, COL_MEDIDA_VARIABLE_1, "MEDIDA VARIABLE 1");
		ftRenglones.getCellFormatter().setWidth(0, COL_MEDIDA_VARIABLE_1, "10%");
		
		// columna medida variable 2
		ftRenglones.setText(0, COL_MEDIDA_VARIABLE_2, "MEDIDA VARIABLE 2");
		ftRenglones.getCellFormatter().setWidth(0, COL_MEDIDA_VARIABLE_2, "10%");
		
		// columna cantidad requerida
		ftRenglones.setText(0, COL_CANTIDAD_REQUERIDA, "CANTIDAD REQUERIDA");
		ftRenglones.getCellFormatter().setWidth(0, COL_CANTIDAD_REQUERIDA, "10%");
		
		// columna cantidad a comprar
		ftRenglones.setText(0, COL_CANTIDAD_A_COMPRAR, "CANTIDAD A COMPRAR");
		ftRenglones.getCellFormatter().setWidth(0, COL_CANTIDAD_A_COMPRAR, "10%");
		
		// columna precio
		ftRenglones.setText(0, COL_PRECIO, "PRECIO");
		ftRenglones.getCellFormatter().setWidth(0, COL_PRECIO, "10%");

		// columna subtotal
		ftRenglones.setText(0, COL_SUBTOTAL, "SUBTOTAL");
		ftRenglones.getCellFormatter().setWidth(0, COL_SUBTOTAL, "10%");
		
		// seteamos el estilo a los encabezados
		ftRenglones.getRowFormatter().addStyleName(0, "tablaEncabezado");
		
		Label lblTextoTotal = new Label("TOTAL: $ ");
		lblTextoTotal.setHorizontalAlignment(HasHorizontalAlignment.ALIGN_RIGHT);
		layoutPanel.add(lblTextoTotal);
		layoutPanel.setWidgetLeftWidth(lblTextoTotal, 70.0, Unit.PCT, 10.0, Unit.PCT);
		layoutPanel.setWidgetTopHeight(lblTextoTotal, 540.0, Unit.PX, 19.0, Unit.PX);
		
		totalTB = new TextBox();
		layoutPanel.add(totalTB);
		layoutPanel.setWidgetLeftWidth(totalTB, 80.0, Unit.PCT, 15.0, Unit.PCT);
		layoutPanel.setWidgetTopHeight(totalTB, 535.0, Unit.PX, 32.0, Unit.PX);
		totalTB.setAlignment(TextAlignment.CENTER);
		totalTB.setEnabled(false);
		
		Label pie = new Label("");
		pie.setStyleName("labelTitulo");
		layoutPanel.add(pie);
		layoutPanel.setWidgetLeftWidth(pie, 2.5, Unit.PCT, 95.0, Unit.PCT);
		layoutPanel.setWidgetTopHeight(pie, 550.0, Unit.PX, 36.0, Unit.PX);
		
		Button btnSalir = new Button("SALIR");
		btnSalir.getElement().setId("btnSalir");
		
		//cuando se presiona el botón salir
		btnSalir.addClickHandler(new ClickHandler() {
			public void onClick(ClickEvent event) {
				cerrarPopUp();
			}
		});
		
		layoutPanel.add(btnSalir);
		layoutPanel.setWidgetRightWidth(btnSalir, 5.0, Unit.PCT, 10.0, Unit.PCT);
		layoutPanel.setWidgetBottomHeight(btnSalir, 15.0, Unit.PX, 28.0, Unit.PX);
		
		Button btnImprimir = new Button("imprimir");
		btnImprimir.setText("IMPRIMIR");
		btnImprimir.getElement().setId("btnImprimir");
		btnImprimir.setVisible(permiteImpresion);
		
		//cuando se presiona el botón imprimir
		btnImprimir.addClickHandler(new ClickHandler() {
			public void onClick(ClickEvent event) {
				imprimir();
			}
		});		
		
		layoutPanel.add(btnImprimir);
		layoutPanel.setWidgetRightWidth(btnImprimir, 17.5, Unit.PCT, 10.0, Unit.PCT);
		layoutPanel.setWidgetBottomHeight(btnImprimir, 15.0, Unit.PX, 28.0, Unit.PX);
		
		cargarOrden();
	}
	
	/**
	 * Método que carga la información de la orden de compra de producto
	 */
	private void cargarOrden()
	{		
		comprasService.buscarOrdenCompraProductoCompleta(idOrdenCompraProducto, new AsyncCallback<OrdenCompraProductoDTO>(){

			@Override
			public void onFailure(Throwable caught) {
				Window.alert("ERROR EN EL SERVICIO");				
			}

			@Override
			public void onSuccess(OrdenCompraProductoDTO result) {
				orden = result;
				mostrarDatos();
				cargarPrecios();
			}});  
	
	}
	
	/**
	 * Método que muestra en la pantalla los datos de una orden de compra de producto
	 */
	private void mostrarDatos()
	{		
		//se utiliza para formatear fechas
		DateTimeFormat formatoFecha = DateTimeFormat.getFormat("dd/MM/yyyy");
		
		proovedorTB.setText(formatearString(orden.getProveedor()));
		ultimaFechaEdicionTB.setText(formatoFecha.format(orden.getUltimaFechaEdicion()));
		modoEnvioTB.setText(formatearString(orden.getModoEnvio()));
		formaPagoTB.setText(formatearString(orden.getFormaPago()));
		ivaTB.setText(formatearString(orden.getIva()));
		taObservaciones.setText(formatearString(orden.getObservaciones()));
	}
	
	
	/**
	 * Método que busca y carga los precios de los productos de la orden de compra.
	 */
	private void cargarPrecios()
	{
		List<Integer> idProductos = new LinkedList<Integer>();
		List<RenglonOrdenCompraProductoDTO> renglones = new LinkedList<RenglonOrdenCompraProductoDTO>();
		renglones.addAll(orden.getRenglones());
		
		for(RenglonOrdenCompraProductoDTO renglon : renglones)
			idProductos.add(renglon.getProducto().getIdProducto());	
		
		
		comprasService.buscarPrecios(orden.getProveedor(), idProductos, new AsyncCallback<List<Double>>()
		{

			@Override
			public void onFailure(Throwable caught) {
				Window.alert("ERROR EN EL SERVICIO." + '\n' + '\n' + caught.getMessage());
			}

			@Override
			public void onSuccess(List<Double> result) {
				precios = result;
				
				//cargamos los renglones de la tabla
				mostrarRenglones();
				
				actualizarTotales();
			}	
		});
	}
	
	
	/**
	 * Método que carga los renglones de la orden de compra
	 */
	private void mostrarRenglones()
	{
		List<RenglonOrdenCompraProductoDTO> renglones = new LinkedList<RenglonOrdenCompraProductoDTO>();
		renglones.addAll(orden.getRenglones());
		
		int numeroFila = 1;
		
		for(RenglonOrdenCompraProductoDTO renglon : renglones)
		{
			//columna elemento
			ftRenglones.setWidget(numeroFila, COL_ELEMENTO, new Label(renglon.getProducto().getElemento().getNombre()));
			ftRenglones.getFlexCellFormatter().setHorizontalAlignment(numeroFila, COL_ELEMENTO, HasHorizontalAlignment.ALIGN_CENTER);
			
			//columna material
			ftRenglones.setWidget(numeroFila, COL_MATERIAL, new Label(renglon.getProducto().getMaterial().getNombre()));
			ftRenglones.getFlexCellFormatter().setHorizontalAlignment(numeroFila, COL_MATERIAL, HasHorizontalAlignment.ALIGN_CENTER);
			
			//columna medida fija
			ftRenglones.setWidget(numeroFila, COL_MEDIDA_FIJA, new Label(renglon.getProducto().getMedidaFija().getMedida()));
			ftRenglones.getFlexCellFormatter().setHorizontalAlignment(numeroFila, COL_MEDIDA_FIJA, HasHorizontalAlignment.ALIGN_CENTER);
			
			//columna medida variable 1
			ftRenglones.setWidget(numeroFila, COL_MEDIDA_VARIABLE_1, new Label(String.valueOf(renglon.getProducto().getMedidaVariable1())));
			ftRenglones.getFlexCellFormatter().setHorizontalAlignment(numeroFila, COL_MEDIDA_VARIABLE_1, HasHorizontalAlignment.ALIGN_CENTER);
			
			//columna medida variable 2
			ftRenglones.setWidget(numeroFila, COL_MEDIDA_VARIABLE_2, new Label(String.valueOf(renglon.getProducto().getMedidaVariable2())));
			ftRenglones.getFlexCellFormatter().setHorizontalAlignment(numeroFila, COL_MEDIDA_VARIABLE_2, HasHorizontalAlignment.ALIGN_CENTER);
			
			String cantidadRequerida = String.valueOf(renglon.getCantidadRequerida());
			
			if(renglon.isEsAdicional())
				cantidadRequerida = " - ";
			
			//columna cantidad requerida
			ftRenglones.setWidget(numeroFila, COL_CANTIDAD_REQUERIDA, new Label(cantidadRequerida));
			ftRenglones.getFlexCellFormatter().setHorizontalAlignment(numeroFila, COL_CANTIDAD_REQUERIDA, HasHorizontalAlignment.ALIGN_CENTER);
			
			//columna cantidad a comprar
			ftRenglones.setWidget(numeroFila, COL_CANTIDAD_A_COMPRAR, new Label(String.valueOf(renglon.getCantidadAComprar())));
			ftRenglones.getFlexCellFormatter().setHorizontalAlignment(numeroFila, COL_CANTIDAD_A_COMPRAR, HasHorizontalAlignment.ALIGN_CENTER);
			
			//columna precio
			ftRenglones.setWidget(numeroFila, COL_PRECIO, new Label(String.valueOf(precios.get(numeroFila-1))));
			ftRenglones.getFlexCellFormatter().setHorizontalAlignment(numeroFila, COL_PRECIO, HasHorizontalAlignment.ALIGN_CENTER);
			
			//columna subtotal
			ftRenglones.setWidget(numeroFila, COL_SUBTOTAL, new Label("0"));
			ftRenglones.getFlexCellFormatter().setHorizontalAlignment(numeroFila, COL_SUBTOTAL, HasHorizontalAlignment.ALIGN_CENTER);
			
			//seteamos el estilo de renglón de tabla
			ftRenglones.getRowFormatter().setStyleName(numeroFila, "tablaRenglon");
			
			numeroFila++;
		}
	}
	
	
	/**
	 * Método que actualiza los subtotales de las filas y el total de la tabla
	 */
	private void actualizarTotales()
	{
		try{
			float total = 0;
			
			for(int i=1; i < ftRenglones.getRowCount(); i++)
			{
				//recuperamos los valoes ingresados en los textbox
				String stringCantidad = ((Label) ftRenglones.getWidget(i, 6)).getText();
				String stringPrecio = ((Label) ftRenglones.getWidget(i, 7)).getText();
				
				float precio = Float.valueOf(stringPrecio);
				float cantidad = Float.valueOf(stringCantidad);
				
				float subtotal = (cantidad * precio)*100/100.00f;			//con "*100/100.00f" logramos redondear el float a 2 decimales 
				
				//actualizamos el subtotal
				Label subtotalLabel = ((Label) ftRenglones.getWidget(i, 8));
				subtotalLabel.setText(String.valueOf(subtotal));
				
				total = total + subtotal;
			}
			
			totalTB.setText(String.valueOf(total));
		}
		
		catch(Exception e){
			Window.alert("Ingrese valores numéricos.");
		}
	}
	
	
	private String formatearString(String dato)
	{
		String datoFormateado = "-";
		
		if(dato != null)
			datoFormateado = dato;
		
		return datoFormateado;
		
	}
	
	/**
	 * Método que imprimir la pantalla. Es código nativo JavaScript, no está comentado.
	 */
	private static native void imprimir() /*-{
		$wnd.document.getElementsByClassName("panelFondo")[0].style.visibility = "hidden"
		$wnd.document.getElementsByClassName('gwt-PopupPanelGlass')[0].style.visibility = 'hidden'
		$wnd.document.getElementById('btnSalir').style.visibility = "hidden"
		$wnd.document.getElementById('btnImprimir').style.visibility = "hidden"
		$wnd.print();
		$wnd.document.getElementsByClassName("panelFondo")[0].style.visibility = "visible";
		$wnd.document.getElementsByClassName('gwt-PopupPanelGlass')[0].style.visibility = 'visible'
		$wnd.document.getElementById('btnSalir').style.visibility = "visible"
		$wnd.document.getElementById('btnImprimir').style.visibility = "visible"
	}-*/; 
	
	/**
	 * Método que cierrar el popup
	 */
	private void cerrarPopUp()
	{
		this.hide();
	}
}

